package compilador.semantico.comando;

import compilador.Command;
import compilador.CommandException;
import compilador.semantico.Atributo;
import compilador.semantico.GerenciadorDeContexto;
import compilador.semantico.Metodo;
import compilador.semantico.SemanticException;
import compilador.semantico.Variavel;

public class VerificaParametroCommand implements Command {

	@Override
	public void run(String... args) throws CommandException {
		GerenciadorDeContexto pilha = GerenciadorDeContexto.getInstance();
		String tipoTopo = pilha.top().getTipo();
		pilha.remove();
		Variavel var = pilha.top();
		if(var.temParametros()) {
			Metodo met = (Metodo) var;
			pilha.incMetodoIndex();
			Atributo param = met.getParametro(pilha.getMetodoIndex());
			if ( param == null ) {
				throw new SemanticException("Parametro invalido");
			} else if (!param.getTipo().equals(tipoTopo)) {
				throw new SemanticException("O metodo esperava um " + param.getTipo() + " mas recebeu um " + tipoTopo) ;
			}
		} else {
			throw new SemanticException(var.getNome() + " nao eh metodo!");
		}
	}
}
